package cn.kgc.jdbc;

import cn.kgc.entity.User;
import com.mysql.jdbc.Driver;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

/**
 * @author 课工场
 * @date 2024/6/26
 * @description java中 jdbc使用的流程
 * <p>
 * jdbc    jdk提供的一套接口  规范    接口中包含操作数据库的常规做法   连接   crud       interface  connection{  }
 * 步骤：
 * 1.  导包  导入驱动   数据库厂商根据jdk提供的接口写的一套实现类
 * 2.  注册驱动
 * 3.  获取连接
 * 4. 获取执行sql语句的对象  preparedStatement    sql注入
 * 5. 执行sql
 * 6. 处理结果集   resultSet
 * 7. 释放资源
 *
 *传统的jdbc操作方式存在的不足：
 * 1.  获取连接的过程繁琐  JDBCUtil
 * 2.  处理结果集繁琐      DBUtil
 * 3.  释放资源过程繁琐    JDBCUtil
 * 4.  代码存在耦合  sql  java代码
 * 5.  搜索业务    根据用于输入的搜索关键词 动态的生成sql语句      动态sql  字符串拼接  参数的保存
 *     学号  studentNo   性别 sex
 *     if(studentNo!=null && sex ==null){
 *         select *  from  student  where  studentNo = ?
 *     }
 *     select *  from  student  where  sex = ?
 *     select *  from  student  where  sex = ? and  studentNo = ?
 *     select *  from  student
 *     动态sql
 *     String sql = select *  from  student  where  1=1
 *     ArrayList<Object> params = new ArrayList<>();
 *
 *     sql+= " and studentNo = ? "      => select *  from  student  where  1=1 and  studentNo = ?
 *     params.add(studentNo)
 *
 *     sql+= " and sex = ?"   =>   select *  from  student  where  1=1 and  studentNo = ? and sex = ?
 *     params.add(sex)
 *   6. 多次相同查询   每次都要数据库执行相同的操作 数据库服务器的压力较大
 *       A  select *  from user     B  select *  from user
 *    缓存   原生jdbc操作没有缓存
 *
 *  mybatis框架可以很好的解决以上分析出来的问题

 */
public class TestJDBC {

    public static void main(String[] args) throws Exception {

        //   注册驱动      反射   获取类对象  Class.forName() 推荐  动态性     类名.class   对象.getClass()
        // Class.forName("com.mysql.jdbc.Driver");
        Driver driver = new Driver();
        DriverManager.registerDriver(driver);


        // 准备数据源参数
        String username = "root";
        String password = "root";
        // http://      jdbc:mysql://  数据库协议
        String url = "jdbc:mysql://localhost:3306/java2425?serverTimezone=GMT%2B8&characterEncoding=UTF-8&useSSL=false";

        // 获取连接
        Connection connection = DriverManager.getConnection(url, username, password);
        System.out.println("connection = " + connection);

        // 编写sql
        String sql = "select *  from user";
        // 获取执行sql语句对象时 会对sql语句进行预编译
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //  执行sql语句
        ResultSet resultSet = preparedStatement.executeQuery();
        // 处理结果集
        ArrayList<User> users = new ArrayList<>();

        while (resultSet.next()) {
            String uname = resultSet.getString("username");
            String pwd = resultSet.getString("password");
            User user = new User();
            user.setPassword(pwd);
            user.setUsername(uname);
            users.add(user);
        }

        // 查看结果集
        users.forEach(System.out::println);

        //     释放资源
        resultSet.close();
        preparedStatement.close();
        connection.close();


    }
}
